// pages/cart/cart.js


import { getSetting, chooseAddress, openSetting, showModal } from '../../utils/asyncWx'


Page({

    /**
     * 页面的初始数据
     */
    data: {
        address: {},
        cart: [],
        allChecked: true,
        totalPrice: 0,
        totalNum: 0

    },
    // 获取收货地址（这个写了当用户取消授权后，又想重新授权时的操作代码）
    async handleChooseAddress() {

        try {
            const result1 = await getSetting()
            const scopeAddress = result1.authSetting["scope.address"]
            if (scopeAddress === false) {
                await openSetting()
            }

            const res2 = await chooseAddress()
                // console.log(res2);
            wx.setStorageSync('address', res2);

        } catch (error) {
            console.error(error)
        }


        // 非promise写法
        // 1，获取权限状态
        // wx.getSetting({
        //     success: (result) => {
        //         const scopeAddress = result.authSetting["scope.address"]
        //             // 用户已授权，或者第一次要求授权
        //         if (scopeAddress === true || scopeAddress === undefined) {
        //             wx.chooseAddress({
        //                 success: (result1) => {
        //                     console.log(result1);
        //                 },

        //             });

        //         } else {
        //             // 用户以前拒绝过授权（scopeAddress === false ），需要重新调取授权
        //             wx.openSetting({
        //                 success: (result2) => {
        //                     wx.chooseAddress({
        //                         success: (result3) => {
        //                             console.log(result3);
        //                         }
        //                     });
        //                 }
        //             });
        //         }
        //     },
        //     fail: () => {},
        //     complete: () => {}
        // });
    },

    // 设置购物车状态，存储数据，重新计算合计等等
    setCart(cart) {

        /**
         * 总价格和总数量
         * 1 都需要商品被选中 我们才拿他来计算
         * 2 获取购物车数组
         * 3 遍历
         * 4 判断商品是否被选中
         * 5 总价格 += 商品的单价 X 商品的数量
         *   总数量 += 商品的数量
         * 6 把计算后的价格和数量 设置回data中即可
         */

        let totalPrice = 0
        let totalNum = 0
        let allChecked = true

        cart.forEach(element => {

            if (element.checked) {
                totalPrice += element.goods_price * element.num
                totalNum += element.num
            } else {
                allChecked = false
            }

        });
        // 处理当数组为空的时候，allchecked的情况
        allChecked = (cart.length === 0) ? false : allChecked

        this.setData({
            cart,
            totalPrice,
            totalNum,
            allChecked
        })
        wx.setStorageSync('cart', cart);
    },
    // 商品条目复选框事件
    handleItemChange(e) {
        /**
         * 1 绑定change事件
         * 2 获取到被修改的商品对象
         * 3 商品对象的选中状态 取反
         * 4 重新填充回data中和缓存中
         * 5 重新计算全选 总价格 总数量，，，
         */
        // console.log(e);
        const goods_id = e.currentTarget.dataset.id
        const cart = this.data.cart

        const index = cart.findIndex(v => v.goods_id === goods_id)
        cart[index].checked = !cart[index].checked

        this.setCart(cart)

    },

    // 全选按钮
    handleItemAllChecked() {
        /**
         * 1 全选复选框绑定事件
         * 2 获取data中的全选变量
         * 3 直接取反 allChecked=!allChecked
         * 4 遍历购物车数组 让里面 商品 选中状态跟随 allchecked 改变而改变
         * 5 把购物车数组 和 allchecked 重新设置回 data 把购物车重新设置回 缓存中
         */

        let { allChecked, cart } = this.data
        allChecked = !allChecked

        cart.forEach(element => {
            element.checked = allChecked
        });

        // this.setData({
        //     allChecked
        // })

        this.setCart(cart)

    },

    // 商品数量加减按钮
    async handleItemNumEdit(e) {
        /**
         * 1 + - 按钮 绑定同一个点击事件 区分的关键 自定义属性 
         *      +   +1
         *      -   -1
         * 2 传递被点击的商品id goods_id
         * 3 获取data中的购物车数组 来获取需要被修改的商品对象
         * 4 直接修改商品对象的数量 num
         * 5 把cart数组 重新设置回 缓存中 和data中 this.setCartCart
         */

        const { id, operation } = e.currentTarget.dataset
        console.log(id, operation);

        let { cart } = this.data

        const index = cart.findIndex(v => v.goods_id === id)

        const that = this

        if (cart[index].num === 1 && operation === -1) {

            const result = await showModal({ content: '是否需要删除' })

            if (result.confirm) {
                cart.splice(index, 1)
                that.setCart(cart)
            } else if (result.cancel) {

            }

        } else {
            cart[index].num += operation

            this.setCart(cart)
        }


    },

    // 结算按钮
    handlePay() {
        const { address, totalNum } = this.data
        if (!address.userName) {
            wx.showToast({
                title: '您还没有选择收货地址',
                icon: 'none'
            });
        } else if (totalNum === 0) {
            wx.showToast({
                title: '购物车里还没有商品',
                icon: 'none'
            });
        } else {
            wx.navigateTo({
                url: '/pages/pay/pay',
                success: (result) => {

                },
                fail: () => {},
                complete: () => {}
            });
        }
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function(options) {

    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady: function() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow: function() {

        const address = wx.getStorageSync('address');
        const cart = wx.getStorageSync('cart') || [];

        // 当every判断空数组的时候，返回 true，所以要避免空数组
        // let allChecked = false
        // if (cart.length !== 0) {
        //     allChecked = cart.every(v => v.checked)
        // }
        this.setData({
            address
        })
        this.setCart(cart)

    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide: function() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload: function() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh: function() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom: function() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage: function() {

    }
})